package com.vlyman.utils;

import com.vlyman.consts.Consts;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.reflect.MethodSignature;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

/**
 * 类描述：
 *  切面工具类
 * @author chenjs
 * @date 2018/10/11 11:17
 **/
public class AspectUtil {

    /**
     * 方法描述：
     *   获取注解对象
     *  @author chenjs
     *  @param joinPoint
     *  @param classz
     *  @return <T extends Annotation>
     *  @date 2018/10/11 11:29
     */
    public static  <T extends Annotation> T getAnnotation(JoinPoint joinPoint, Class<T> classz) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        return method.getAnnotation(classz);
    }

    /**
     * 方法描述：
     *   获取请求的方法名全路径
     *  @author chenjs
     *  @param joinPoint
     *  @return String
     *  @date 2018/10/11 11:31
     */
    public static String getFullMethodName(JoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = signature.getName();
        return className + "." + methodName + "()";
    }

    /**
     * 方法描述：
     *   根据对象属性名调取get方法，获取属性
     *  @author chenjs
     *  @param fieldName 属性名，多个参数用,(英文逗号)隔开
     *  @param arg 提取的对象
     *  @return Object[]
     *  @date 2018/10/11 21:17
     */
    public static Object[] getAttributeFromArgByFieldName(String fieldName, Object arg) throws Exception {
        String[] fields = fieldName.split(Consts.COMMA_ENG);
        Object[] attributes = new Object[fields.length];
        for (int i = 0; i < fields.length; i++) {
            Method method = arg.getClass().getMethod(getGetterNameByFiledName(fields[i]));
            attributes[i] = method.invoke(arg);
        }
        return attributes;
    }

    /**
     * 方法描述：
     *   根据属性名 得到该属性的getter方法名
     *  @author chenjs
     *  @param field
     *  @return String
     *  @date 2018/10/11 20:58
     */
    public static String getGetterNameByFiledName(String field) {
        return "get" + field.substring(0 ,1).toUpperCase() + field.substring(1) ;
    }

    /**
     * 方法描述：
     *   根据索引值获取属性名
     *  @author chenjs
     *  @param fieldName
     *  @param index
     *  @return String
     *  @date 2018/10/12 10:28
     */
    public static String findAttributeNameByIndex(String fieldName, int index) {
        if (fieldName.indexOf(Consts.COMMA_ENG) == -1) {
            return fieldName;
        }
        return fieldName.split(Consts.COMMA_ENG)[index];
    }
}
